package ru.testing.client.controllers;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.LoggingFilter;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.ToggleButton;
import org.controlsfx.control.MasterDetailPane;
import org.controlsfx.control.SegmentedButton;
import ru.testing.client.MainApp;
import ru.testing.client.common.DataBase;
import ru.testing.client.common.HttpTypes;
import ru.testing.client.common.Utils;
import ru.testing.client.common.objects.Header;
import ru.testing.client.common.objects.HttpParameter;
import ru.testing.client.common.objects.Settings;
import javax.ws.rs.core.MultivaluedMap;
import java.util.ArrayList;
import java.util.List;
import static ru.testing.client.common.Utils.getJsonPretty;
/**
* Controller for detail message tab form
*/
public class TabRestController {
private static final int TIMEOUT = 10000;
private DataBase dataBase = DataBase.getInstance();
private MainController mainController = MainApp.getMainController();
private List<Header> headers = new ArrayList<>();
private List<HttpParameter> parameters = new ArrayList<>();
private Client restClient = Client.create();
private String serverUrl;
private HttpTypes httpType;
private String message;
@FXML
private MasterDetailPane masterDetailPane;
@FXML
private TextArea masterNode;
@FXML
private TextArea detailNode;
@FXML
private ToggleButton bWrapText;
@FXML
private ToggleButton bPrettyJson;
@FXML
private ToggleButton showHeaders;
@FXML
private ToggleButton editBody;
@FXML
private Label msgLengthLabel;
@FXML
private SegmentedButton segmentedButton;
@FXML
private void initialize() {
// Get message settings
Settings settings = dataBase.getSettings();
segmentedButton.setToggleGroup(null);
// Set message as json pretty or text
bPrettyJson.setOnAction(event -> setMasterMessage());
// Set text area wrap or not
bWrapText.setOnAction(event -> setWrapText());
if (settings.isTextWrap()) {
bWrapText.fire();
}
// Set enable or disable edit body message
editBody.setOnAction(event -> setEditBody());
// Set message font size
masterDetailPane.setStyle(String.format("-fx-font-size: %spx;", settings.getFontSize()));
// Hide or show response headers
showHeaders.setOnAction(event -> {
if (showHeaders.isSelected()) {
masterDetailPane.setShowDetailNode(true);
} else {
masterDetailPane.setShowDetailNode(false);
}
segmentedButton.requestFocus();
});
// Create http client
serverUrl = mainController.getServerUrl().getText();
httpType = mainController.getHttpType();
restClient.setConnectTimeout(TIMEOUT);
restClient.setReadTimeout(TIMEOUT);
execute();
}
void execute() {
headers.clear();
headers.addAll(mainController.getHeadersList());
parameters.clear();
parameters.addAll(mainController.getHttpParametersList());
ClientResponse response = null;
MultivaluedMap<String, String> parametersMap = new MultivaluedMapImpl();
parameters.forEach(p -> parametersMap.add(p.getName(), p.getValue()));
switch (httpType) {
case HTTP_GET:
WebResource.Builder getResource = restClient.resource(serverUrl)
.queryParams(parametersMap).getRequestBuilder();
headers.forEach(header -> getResource.header(header.getName(), header.getValue()));
response = getResource.get(ClientResponse.class);
break;
case HTTP_POST:
WebResource.Builder postResource = restClient.resource(serverUrl).getRequestBuilder();
mainController.getHeadersList().forEach(header -> postResource.header(header.getName(), header.getValue()));
response = postResource.post(ClientResponse.class, parametersMap);
break;
}
// Set http action
if (response != null) {
message = response.getEntity(String.class);
// Set body result to master node
Platform.runLater(() -> {
setWrapText();
setMasterMessage();
setEditBody();
msgLengthLabel.setText(String.valueOf(message.length()));
});
// Set headers result to detail node
setHeadersDetail(response);
}
}
TextArea getMasterNode() {
return masterNode;
}
TextArea getDetailNode() {
return detailNode;
}
/**
* Set headers info from response
*
* @param response ClientResponse
*/
private void setHeadersDetail(ClientResponse response) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(httpType.getName())
.append(" ")
.append(serverUrl)
.append(" ")
.append(response.getStatus())
.append(" ")
.append(response.getStatusInfo())
.append("\n")
.append(response.getResponseDate())
.append("\n");
response.getHeaders().forEach((k, v) -> stringBuilder.append(k)
.append(": ")
.append(v)
.append("\n"));
detailNode.setText(stringBuilder.toString());
}
HttpTypes getHttpType() {
return httpType;
}
String getServerUrl() {
return serverUrl;
}
List<Header> getHeaders() {
return headers;
}
List<HttpParameter> getParameters() {
return parameters;
}
private void setMasterMessage() {
if (message != null && bPrettyJson.isSelected()) {
Utils.PrettyStatus status = getJsonPretty(message);
masterNode.setText(status.getMessage());
bPrettyJson.setSelected(status.getButtonSelect());
} else {
masterNode.setText(message);
}
segmentedButton.requestFocus();
}
private void setWrapText() {
if (bWrapText.isSelected()) {
masterNode.setWrapText(true);
detailNode.setWrapText(true);
} else {
masterNode.setWrapText(false);
detailNode.setWrapText(false);
}
segmentedButton.requestFocus();
}
private void setEditBody() {
if (editBody.isSelected()) {
masterNode.setEditable(true);
} else {
masterNode.setEditable(false);
}
segmentedButton.requestFocus();
}
}